package com.oss.base.dao;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;


/**
* Title: IBaseDao
* Description: 基础数据库操作类
* Company: sungoin 
* @author   wjt
* @date       2016-1-25
*/
public interface IBaseDao {

	public Session getCurrentSession();
	
	
	//==================================== LOAD METHOD  ======================================

	/**
	* Title: findByCriteria
	* Description: 
	* @author   wjt
	* @date       2016-1-25
	* @param detachedCriteria
	* @return
	*/
	public abstract <T> List<T> findByCriteria(DetachedCriteria detachedCriteria);
	/**
	* Title: load
	* Description: 根据ID获取对象. 实际调用Hibernate的session.load()方法
	* 						返回实体或其proxy对象. 如果对象不存在，抛出异常.
	* 						lazy属性为true，如果脱离了session上下文，
	* 						除了ID值之外无法取得其他属性的值
	* @author   wjt
	* @date       2016-1-25
	* @param entityClass
	* @param id
	* @return
	*/
	public abstract <T> T load(Class<T> entityClass, Serializable id);

	
	/**
	* Title: loadAll
	* Description: 查询所有
	* @author   wjt
	* @date       2016-1-25
	* @param entityClass
	* @return
	*/
	public abstract <T> List<T> loadAll(Class<T> entityClass);

	/**
	* Title: loadAll
	* Description: 获取全部对象,带排序字段与升降序参数
	* @author   wjt
	* @date       2016-1-25
	* @param entityClass
	* @param orderBy
	* @param isAsc
	* @return
	*/
	public abstract <T> List<T> loadAll(Class<T> entityClass, String orderBy, boolean isAsc);
	
	/**
	* Title: get
	* Description: 根据ID获取对象. 实际调用Hibernate的session.get()方法返回实体或NULL.
	* @author   wjt
	* @date       2016-1-25
	* @param entityClass
	* @param id
	* @return
	*/
	public <T> T get(Class<T> entityClass, Serializable id);


	//================================== SAVE UPDATE DELETE METHOD  ===============================	

	/**
	* Title: save
	* Description: 
	* @author   wjt
	* @date       2016-1-25
	* @param o
	*/
	public abstract void save(Object o);

	/**
	* Title: update
	* Description: 
	* @author   wjt
	* @date       2016-1-25
	* @param o
	*/
	public abstract void update(Object o);
	
	/**
	* Title: saveOrUpdate
	* Description: 
	* @author   wjt
	* @date       2016-1-25
	* @param o
	*/
	public abstract void saveOrUpdate(Object o);

	/**
	* Title: saveOrUpdateAll
	* Description: 
	* @author   wjt
	 * @param <T>
	* @date       2016-1-25
	* @param col
	*/
	public abstract <T> void saveOrUpdateAll(Collection<T> col);
	
	/**
	* Title: delete
	* Description: 
	* @author   wjt
	* @date       2016-1-25
	* @param o
	*/
	public abstract void delete(Object o);

	/**
	* Title: delete
	* Description: 根据ID删除对象
	* @author   wjt
	* @date       2016-1-25
	* @param entityClass
	* @param id
	*/
	public abstract <T> void delete(Class<T> entityClass, Serializable id); 

	/**
	* Title: deleteAll
	* Description: 
	* @author   wjt
	* @date       2016-1-25
	* @param col
	*/
	public abstract void deleteAll(Collection<Object> col);

	/**
	* Title: flush
	* Description: 
	* @author   wjt
	* @date       2016-1-25
	*/
	public abstract void flush();

	/**
	* Title: clear
	* Description: 
	* @author   wjt
	* @date       2016-1-25
	*/
	public abstract void clear();

	//===============================    简化处理单表查询：利用范型查询单张表格  ==============================

	/**
	* Title: findByLike
	* Description: 根据属性名和属性值查询对象,利用 Like 语句
	* @author   wjt
	* @date       2016-1-25
	 * @param <T>
	 * @param entityClass   表格的名字
	 * @param fieldName     字段名称
	 * @param fieldValue    字符型查询值
	 * @return              符合条件的对象列表
	*/
	public abstract <T> List<T> findByLike(Class<T> entityClass,
			String fieldName, String fieldValue);

	/**
	* Title: findByLike
	* Description: 查询条件为VO的属性，查询的结果为此VO的列表
	* @author   wjt
	* @date       2016-1-25
	* @param <T>
	* @param entityClass     表格的名字
	* @param fieldName       字段名称
	* @param fieldValue      查询值
	* @param orderFieldName  排序字段名称
	* @return                符合条件的对象列表
	*/
	public abstract <T> List<T> findByLike(Class<T> entityClass,
			String fieldName, String fieldValue, String orderFieldName);

	/**
	* Title: findByObject
	* Description: 查询条件为VO的属性，查询的结果为此VO的列表
	* @author   wjt
	* @date       2016-1-25
	 * @param vo  查询条件
	 * @return
	*/
	public abstract <T> List<T> findByObject(Object vo);

	/**
	* Title: findFirstVO
	* Description: 查询条件为VO的属性，查询的结果为此VO；如果有多个符合此查询条件的值，返回第一个 
	* @author   wjt
	* @date       2016-1-25
 	* @param vo  查询条件
 	* @return	
	*/
	public abstract <T> T findFirstVO(Object vo);

	/**
	* Title: find
	* Description: 根据hql查询,直接使用HibernateTemplate的find函数.
	* @author   wjt
	* @date       2016-1-25
	* @param hql
	* @param values
	* @return
	*/
	public abstract List find(String hql, Object... values);

	/**
	* Title: find
	* Description: 按照查询条件查询，可以支持多表连接
	* @author   wjt
	* @date       2016-1-25
	* @param hql
	* @return
	*/
	public abstract List find(String hql);

	/**
	* Title: find
	* Description: 分页查询
	* @author   wjt
	* @date       2016-1-25
	* @param hql     查询语句
	* @param index   开始值
	* @param length  结束值
	* @return
	*/
	public abstract List find(String hql, int index, int length);

	/**
	* Title: getRecordCount
	* Description: 根据查询条件计算符合条件的纪录数目
	* @author   wjt
	* @date       2016-1-25
	* @param queryString
	* @return
	*/
	public abstract int getRecordCount(String queryString);

	/**
	* Title: updateByHql
	* Description: 	 * 根据ＳＱＬ语句来更新数据库,可以批量删除、更新数据库纪录
	 * 
	* @author   wjt
	* @date       2016-1-25
	* @param hql
	* @return
	*/
	public abstract int updateByHql(String hql);

	 

	/**
	* Title: findFirstVO
	* Description: 如果有多个符合此查询条件的值，返回第一个
	* @author   wjt
	* @date       2016-1-25
	* @param hql
	* @return
	*/
	public abstract <T> T findFirstVO(String hql);

}